package consumer

import (
	"context"
	"encoding/json"

	userwashlogic "gitee.com/liuxuezhan/ar-platform/assets-rpc/internal/logic/userwash"
	"gitee.com/liuxuezhan/ar-platform/assets-rpc/internal/svc"
	kafkaMQ "gitee.com/liuxuezhan/ar-platform/base-common/amqp/kafka"
	"gitee.com/liuxuezhan/ar-platform/base-common/amqp/kafka/config"
	"github.com/zeromicro/go-zero/core/logx"
)

type ConsumerBet struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger

	consumer    *kafkaMQ.Consumer
	consumerNum int64
}

func NewConsumerBet(ctx context.Context, svcCtx *svc.ServiceContext) *ConsumerBet {
	consumer := kafkaMQ.NewConsumer(config.CustomerConfig{
		ProviderConfig: config.ProviderConfig{
			Brokers: svcCtx.Config.KafkaProvider.Brokers,
			Topic:   "bet",
		},
		GroupID: "assets_consume_bet", // 相同 GroupID的消费者只会消费一次
	})
	return &ConsumerBet{
		ctx:         ctx,
		svcCtx:      svcCtx,
		Logger:      logx.WithContext(ctx),
		consumer:    consumer,
		consumerNum: 1,
	}
}

func (u *ConsumerBet) HandleMessage(message kafkaMQ.KafkaMessage) error {

	u.Logger.Infof("received message: key=%s, value=%s", message.Key, string(message.Data))
	var _message BetEvent
	err := json.Unmarshal(message.Data, &_message)
	if err != nil {
		return err
	}

	err = userwashlogic.NewUserWashBetLogic(u.ctx, u.svcCtx).AssetsConsumeBet(
		_message.EventType, _message.BetAmount, _message.UserId, _message.CategoryCode)
	return err
}

func (u *ConsumerBet) Run() {
	defer u.consumer.Close()

	for _ = range u.consumerNum {
		// Consume messages
		go func() {
			err := u.consumer.ConsumeMessages(u.HandleMessage)
			if err != nil {
				u.Logger.Error("consumer.ConsumeMessages,err", err)
			}
		}()
	}

	// Wait to consume messages
	select {}
}

// 用户投注事件
type BetEvent struct {
	EventType     string  `json:"event_type"`     // 事件类型 bet,bet_cancel
	UUID          string  `json:"uuid"`           // 注单唯一标识符
	ReqId         string  `json:"req_id"`         // 请求标识符。同一请求重送请求时会与前次不同。  (长度最长50)
	BetAmount     float64 `json:"bet_amount"`     // 押注金额,>=0
	WinloseAmount float64 `json:"winlose_amount"` // 派彩金额, >=0, 大于0则为赢
	Turnover      float64 `json:"turnover"`       // 有效投注金额,  结算才会带入
	Type          int     `json:"type"`           // 注单类型: 1=下注 2=结算
	UserId        int64   `json:"user_id"`        // 玩家账号唯一值
	GameCode      string  `json:"game_code"`      // 平台游戏编码
	CategoryCode  string  `json:"category_code"`  // 游戏大分类 code
	SubtypeCode   string  `json:"subtype_code"`   // 游戏小分类 code
	ReferenceId   string  `json:"reference_id"`   // 免费局数序号  (营运商呼叫  CreateFreeSpin  时带入)
	Remain        int     `json:"remain"`         // 剩余免费局数  (只包含目前序号的剩余局数)
	WagersTime    int64   `json:"wagers_time"`    // 时间戳  (依  type  不同为下注时间或结账时间)
	PlayType      string  `json:"play_type"`      // 玩法,"1min", "3min", "5min", "10min"等
}
